﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.Common;
using System.Linq;
using Hotel.Domain;
using Hotel.Util;


namespace HOTEL.Dao
{
    public class ChucVuDao : BaseDAO
    {
        public CHUC_VU Get(int ma)
        {
            return _db.CHUC_VUs.Where(p => p.MaChucVu.Equals(ma)).SingleOrDefault();
        }

        public List<CHUC_VU> Search(string key)
        {
            return _db.CHUC_VUs.Where(p => p.TenChucVu.ToUpper().Contains(key.ToUpper())).ToList();
        }

        public List<CHUC_VU> GetList()
        {
            return _db.CHUC_VUs.OrderBy(cv => cv.TenChucVu).ToList();
        }

        //public List<CHUC_VU> GetListForWeb()
        //{
        //    return _db.CHUC_VUs.Where(p=>p.ISACTIVE.Equals(true)).OrderBy(cv => cv.TenChucVu).ToList();
        //}

        public List<CHUC_VU> GetList(int ?MaChucVu, string TenChucVu,string mota)
        {
            var query = _db.CHUC_VUs.AsQueryable();

            if (MaChucVu.HasValue)
                query = query.Where(cv => cv.MaChucVu.Equals(MaChucVu)).AsQueryable();

            if (!string.IsNullOrEmpty(TenChucVu))
                query = query.Where(cv => cv.TenChucVu.Contains(TenChucVu)).AsQueryable();

            return query.OrderBy(cv => cv.TenChucVu).ToList();
        }

        public int Count()
        {
            return _db.CHUC_VUs.Count();
        }

        public Message Insert(CHUC_VU objUi)
        {
            Message msg;
            try
            {

                _db.Connection.Open();

                _db.CHUC_VUs.InsertOnSubmit(objUi);
                _db.SubmitChanges();

                // commit

                // success message
                msg = new Message(MessageConstants.I_CREATE_SUCCEED, MessageType.Info, "loại phòng ");
            }
            catch (Exception ex)
            {
                // rollback transaction

                msg = ExceptionHandler.HandleInsertException(ex, "loại phòng ", objUi.TenChucVu);
            }
            return msg;
        }

        public Message Update(CHUC_VU objUi)
        {
            Message msg;
            try
            {
                // get current object in database
                var objDb = Get(objUi.MaChucVu);

                if (objDb != null)
                {
                    //TODO: update all fields
                    objDb.TenChucVu = objUi.TenChucVu;
                    _db.SubmitChanges();

                    // success message
                    msg = new Message(MessageConstants.I_UPDATE_SUCCEED, MessageType.Info, "loại phòng ");
                }
                else
                {
                    // error message
                    msg = new Message(MessageConstants.E_OBJECT_IN_USED, MessageType.Error, "loại phòng ", objUi.TenChucVu);
                }
            }
            catch (Exception ex)
            {
                msg = ExceptionHandler.HandleUpdateException(ex, "loại phòng ", objUi.TenChucVu);
            }
            return msg;
        }

        public bool IsInUse(string ma)
        {
            return true;// _db.SANPHAMs.Where(p => p.CHUC_VU.Equals(ma)).Count() > 0;
        }

        public Message Delete(CHUC_VU objUi)
        {
            Message msg;

            try
            {
                // Get current Item in db
                var objDb = Get(objUi.MaChucVu);

                if (objDb == null)
                {
                    // error message
                    msg = new Message(MessageConstants.E_OBJECT_NOT_EXISTS, MessageType.Error, "loại phòng  ", objUi.TenChucVu);
                    return msg;
                }


                // Set delete info
                _db.CHUC_VUs.DeleteOnSubmit(objDb);
                // Submit changes to db
                _db.SubmitChanges();

                // success message
                msg = new Message(MessageConstants.I_DELETE_SUCCEED, MessageType.Info, "loại phòng  ");
            }
            catch (Exception ex)
            {
                msg = ExceptionHandler.HandleDeleteException(ex, "loại phòng  ");
            }

            return msg;
        }

        public Message DeleteList(List<CHUC_VU> objList)
        {
            Message msg;
            DbTransaction trans = null;

            try
            {
                _db.Connection.Open();
                trans = _db.Connection.BeginTransaction();
                _db.Transaction = trans;

                var failed = 0;

                foreach (var obj in objList)
                {
                    var temp = Delete(obj);
                    if (temp != null && temp.MsgType.Equals(MessageType.Error))
                        failed++;
                }

                // commit
                trans.Commit();

                if (failed > 0)
                {
                    if (failed == objList.Count)
                        return new Message(MessageConstants.E_DELETE_FAILED_EXCEPTION, MessageType.Info, "danh sách loại phòng ");

                    var succeed = objList.Count - failed;
                    return new Message(MessageConstants.W_DELETELIST_SUCCEED_WITH_ERRORS, MessageType.Warning,
                                       succeed, "loại phòng ", failed, "loại phòng ");
                }
                // success message
                msg = new Message(MessageConstants.I_DELETE_SUCCEED, MessageType.Info, objList.Count + " loại phòng ");
            }
            catch (Exception ex)
            {
                // rollback transaction
                if (trans != null)
                    trans.Rollback();

                msg = ExceptionHandler.HandleInsertException(ex, "danh sách loại phòng ");
            }

            return msg;
        }
        public List<CHUC_VU> GetListByQuocGia(String maquocgia)
        {
            return _db.CHUC_VUs.Where(p => p.MaChucVu.Equals(maquocgia)).ToList();
        }
        
    }
}

